'''
@create_time: 2025/10/23 下午1:50
@Author: GeChao
@File: run.py
'''

import argparse
import os
import platform
from pathlib import Path
from tools.path_manage import ProjectFilePath
from tools.test_environment_init import environment_init
from tools.log import Logger
from tools.db_connection import DbConnectionFactory
from tools.notification_manager import NotificationManager

PROJECT_FILE_PATH = ProjectFilePath()
logger = Logger().logger

# 获取generate_test_report.py的绝对路径
GENERATE_REPORT_SCRIPT = str(Path(__file__).parent / 'generate_test_report.py')


def run_main():
    report_dir = PROJECT_FILE_PATH.test_case_report_path
    web_case_dir = PROJECT_FILE_PATH.test_web_ui_case_path

    parser = argparse.ArgumentParser(prog='测试用例执行命令行')
    parser.add_argument('-w', '--web', action='store_true', help='执行web测试用例')
    parser.add_argument('-cls', '--clear', default='1', help='是否清理历史报告数据：0.否，1.是  (默认 1)', type=str)
    parser.add_argument('-g', '--generate', default='1', help='是否自动生成用例数据：0.否，1.是 (默认 1)', type=str)
    # 通知参数
    parser.add_argument('-notify', '--notify_config', action='store_true', help='使用配置文件发送通知')
    args = parser.parse_args()

    if args.clear == '1':
        logger.info('开始清理历史报告数据')
        environment_init()

    if args.web:
        os.chdir(str(web_case_dir))
        os.system(f'pytest -sv --alluredir={report_dir / "allure-results"} ')

    with DbConnectionFactory() as db_factory:
        sqlite_conn = db_factory.create_connection(connection_type='sqlite',
                                                   db_path=ProjectFilePath().test_result_db_path).connect()
        fail_total = sqlite_conn.select('test_result_tb', ["count(1)", ], where={"execution_result": "fail"})[0][0]
        pass_total = sqlite_conn.select('test_result_tb', ["count(1)", ], where={"execution_result": "pass"})[0][0]

        # 生成Allure静态报告（跨平台兼容）
        logger.info('📊 开始生成Allure静态报告...')
        if platform.system() == 'Windows':
            # Windows: 后台启动
            os.system(f'start /b python "{GENERATE_REPORT_SCRIPT}" -a')
        else:
            # Linux/Mac: 直接调用生成静态报告
            os.system(f'python "{GENERATE_REPORT_SCRIPT}" -a')
        logger.info(f'✅ Allure报告已生成到: {report_dir / "allure-report"}')

        # 发送通知(使用配置文件)
        if args.notify_config:
            logger.info("📢 使用配置文件发送通知...")
            notification_manager = NotificationManager()
            notification_manager.send_notifications()


if __name__ == '__main__':
    run_main()
